//
//  main.m
//  08_Work
//
//  Created by dllo on 16/7/13.
//  Copyright © 2016年 yh. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Car.h"
#import "Animal.h"
#import "Cat.h"
#import "NSMutableArray+Convert.h"
int main(int argc, const char * argv[]) {
#if 0
    // iOS9新特性三块的深入理解, 创建几个类, 熟悉写法(提交练习成果)
    // 1. nonnull nullable 和 null_resettable
    Car *car = [[Car alloc] init];
    // car的name属性已经设为nonull 所以他的setter getter方法不能为空
    car.name = @"Benz";
    NSString *str = car.name;
    NSLog(@"%@", str);
    // car 的color属性设为nullable 所以setter 和 getter可以为空
    car.color = @"red";
    car.color = nil;
    // car 的type属性设为null_resettable 他的setter方法可以为空 getter不为空
    car.type = @"G55";
    car.type = nil;
    NSString *str1 = car.type;
    NSLog(@"%@", str1);
#endif
    // 2. 泛型
    // NSMutableArray<NSString *> *arr 表示数组中存放的元素类型都是字符串型的 从而使数组元素具有字符串的属性 (例如:可以".length")
    NSMutableArray<NSString *> *arr = [NSMutableArray arrayWithObjects:@"yuhan", @"huaidan", nil];
    NSInteger a = arr.lastObject.length;
    NSLog(@"%ld", a);
    // 自定义泛型
    Cat *cat = [[Cat alloc] init];
    Animal<Cat *> *animal = [[Animal alloc] init];
    //    [animal add:<#(Cat *)#>];
    [animal add:cat];
    
    Animal *newAnimal = [[Animal alloc] init];
    Animal<NSArray *> *animal1 = [[Animal alloc] init];
    Animal<NSMutableArray *> *animal2 = [[Animal alloc] init];
    // 协变性 __covariant 子类给父类赋值时自动强转
    animal1 = animal2;
    // 逆变性 __contravariant 父类给子类赋值时自动强转
    animal2 = animal1;
    
    // 3. __kindof
    Animal *kindofAnimal = [[Animal alloc] init];
    NSString *str = [kindofAnimal returnStr];
    
    
    // OS 类扩展方式的复习 1> 给NSMutableArray添加convert方法，实现数组倒序。
    // 创建类目
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"yuhan", @"zhaohao", @"huaidan", nil];
    NSMutableArray *mutArr = [NSMutableArray array];
    mutArr = [array reverse:array];
    NSLog(@"%@", mutArr);
//    预习UI内容
    
    
    return 0;
}
